'''
1.对于参数中提供了初始值的参数，由于 Python 中的函数参数传递的是对象，
也可以认为是传地址，在第一次初始化 def 的时候，会先生成这个可变对象的内存地址，
然后将这个默认参数 item_list 会与这个内存地址绑定。在后面的函数调用中，如果调用方指定了新的默认值，
就会将原来的默认值覆盖。如果调用方没有指定新的默认值，那就会使用原来的默认值。
def appendlist(item,k=[]):
    k.append(item)
    print(k)
appendlist(1)
appendlist(2)
appendlist(3,[3,4,5])

2.索引异常
a = [1,2,3]
print(a[5:])居然返回得时None,没有报out of range list

4.函数参数
从上面的例子可以看出，默认参数可以简化函数的调用。设置默认参数时，有几点要注意：
一是必选参数在前，默认参数在后
https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888


5.在python中...和pass含义差不多，什么都不做。实际是一个单例Ellipsis
def s(l=...):
    ...
    print(l)  输出Ellipsis
s()

6 python 函数闭包
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)#注意这里只是将f函数地址添加到列表中  并没有真正的执行。
    return fs

f1, f2, f3 = count()
print(f1())#这里真正执行的时候才会进入函数的内部，但是此时的i因为是函数的局部变量，会被引用，i=3
print(f2())
print(f3())
#全部都是9！原因就在于返回的函数引用了变量i，但它并非立刻执行。等到3个函数都返回时，它们所引用的变量i已经变成了3，因此最终结果为9。

#
# def count():
#     def f(j):
#         def g():
#             return j*j
#         return g
#     fs = []
#     for i in range(1, 4):
#         fs.append(f(i)) # f(i)立刻被执行，因此i的当前值被传入f()
#     return fs
# f1, f2, f3 = count()
# print(f1())
# print(f2())
# print(f3())

def createCounter():
    index=0
    def counter():
        nonlocal index  #将a声明为nonlocal变量(仅在Python3支持)，这样声明过后，就不会被认为是bar()函数的局部变量，而是会到上一层函数环境中寻找这个变量。
        index+=1
        return index
    return counter
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA())
'''


'''
二进制的位运算
了解二进制的原码  补码  反码
与运算&
异或运算^
左移n位 <<n   相当于乘以2**n
右移>>n

在32位计算机中最大的整数  0x7fffffff  最高为8的代表负数0x8ffffff

在计算机中  整数用原码表示  负数用补码表示
负数的补码等于保留符号位其余的取反加一

'''
print(hex(-2147483647))
print(~6)
print((~-6)^1)